package cn.com.blueInfo.bpm.template.service.impl;

import cn.com.blueInfo.bpm.template.convert.FileConvert;
import cn.com.blueInfo.bpm.template.entity.File;
import cn.com.blueInfo.bpm.template.repository.FileRepository;
import cn.com.blueInfo.bpm.template.request.FileDTO;
import cn.com.blueInfo.bpm.template.response.FileVO;
import cn.com.blueInfo.bpm.template.service.FileService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 流程附件管理表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:30:44
 */
@Log4j2
@Service
public class FileServiceImpl implements FileService {

    @Autowired
    private FileRepository fileRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private FileConvert fileConvert;

    /**
     * 新增流程附件管理
     * @param fileDTO 流程附件管理参数
     */
    @Override
    public ResultInfo<Integer> addFile(FileDTO fileDTO) {
        File file = fileConvert.dtoToEntity(fileDTO);
        file.setId(snowflakeIdGenerator.nextId());
        Integer addSize = fileRepository.createFile(file);
        return ResultInfo.<Integer>builder().data(addSize).message("流程附件管理成功新增 {} 条").build();
    }

    /**
     * 批量新增流程附件管理
     * @param fileDTOList 流程附件管理参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddFile(List<FileDTO> fileDTOList) {
        List<File> fileList = fileConvert.dtoToEntity(fileDTOList);
        for (File file : fileList) file.setId(snowflakeIdGenerator.nextId());
        Integer addSize = fileRepository.batchCreateFile(fileList);
        return ResultInfo.<Integer>builder().data(addSize).message("流程附件管理成功新增 {} 条").build();
    }

    /**
     * 删除流程附件管理
     * @param fileId 流程附件管理ID
     */
    @Override
    public ResultInfo<Integer> removeFile(Long fileId) {
        Integer removeSize = fileRepository.deleteFile(fileId);
        return ResultInfo.<Integer>builder().data(removeSize).message("流程附件管理成功删除 {} 条").build();
    }

    /**
     * 批量删除流程附件管理
     * @param fileIdList 流程附件管理ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveFile(List<Long> fileIdList) {
        Integer removeSize = fileRepository.batchDeleteFile(fileIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("流程附件管理成功删除 {} 条").build();
    }

    /**
     * 更新部分流程附件管理
     * @param fileUpdatePartialDTO 流程附件管理参数
     */
    @Override
    public ResultInfo<Integer> modifyFilePartial(FileDTO.UpdatePartialDTO fileUpdatePartialDTO) {
        File file = fileConvert.dtoToEntity(fileUpdatePartialDTO);
        Integer modifySize = fileRepository.updateFilePartial(file);
        return ResultInfo.<Integer>builder().data(modifySize).message("流程附件管理成功更新 {} 条").build();
    }

    /**
     * 更新全部流程附件管理
     * @param fileDTO 流程附件管理参数
     */
    @Override
    public ResultInfo<Integer> modifyFile(FileDTO fileDTO) {
        File file = fileConvert.dtoToEntity(fileDTO);
        Integer modifySize = fileRepository.updateFile(file);
        return ResultInfo.<Integer>builder().data(modifySize).message("流程附件管理成功更新 {} 条").build();
    }

    /**
     * 查询一条流程附件管理
     * @param fileId 流程附件管理ID
     */
    @Override
    public ResultInfo<FileVO> queryFileById(Long fileId) {
        File file = fileRepository.getFileById(fileId);
        FileVO fileVO = fileConvert.entityToVO(file);
        return ResultInfo.<FileVO>builder().data(fileVO).message("流程附件管理查询成功").build();
    }

    /**
     * 分页查询流程附件管理
     * @param fileQueryDTO 流程附件管理参数
     */
    @Override
    public ResultInfo<Page<FileVO>> queryFilePage(FileDTO.QueryDTO fileQueryDTO) {
        Page<File> filePage = fileRepository.getFilePage(fileQueryDTO);
        Page<FileVO> resultData = fileConvert.convertPage(filePage);
        return ResultInfo.<Page<FileVO>>builder()
                .data(resultData)
                .message("流程附件管理分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 流程附件管理 数量
     * @param fileQueryDTO 流程附件管理参数
     */
    @Override
    public ResultInfo<Long> queryFileCount(FileDTO.QueryDTO fileQueryDTO) {
        Long resultCount = fileRepository.getFileCount(fileQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("流程附件管理数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 流程附件管理
     * @param fileQueryDTO 流程附件管理参数
     */
    @Override
    public ResultInfo<List<FileVO>> queryFileList(FileDTO.QueryDTO fileQueryDTO) {
        List<File> fileList = fileRepository.getFileList(fileQueryDTO);
        List<FileVO> resultData = fileConvert.entityListToVoList(fileList);
        return ResultInfo.<List<FileVO>>builder()
                .data(resultData)
                .message("流程附件管理分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
